package com.Book.test_1_25_springmvcbook.Controller;

import com.Book.test_1_25_springmvcbook.Service.BookService;
import com.Book.test_1_25_springmvcbook.constant.Constant;
import com.Book.test_1_25_springmvcbook.enums.ResultCode;
import com.Book.test_1_25_springmvcbook.model.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;


// 图书列表接口
@Slf4j
@RequestMapping("/book")
@RestController
public class BookController {
    //BookService bookService = new BookService();
    // 接下来用IoC的实现思想
    @Autowired // 通过这个注解来实现, IoC的思想
    // 也就是 告诉Spring 从容器中取出这个对象, 放在当前的对象中, (把这个对象赋值给当前对象的属性)
    private BookService bookService;

    // 等同于下面这个写法
 /*   public BookController() {
        bookService = new BookService();
    }*/

//    @RequestMapping("/getBookList")
//    public List<BookInfo> getBookList(){
//        // 1. 获取图书的数据
//        // 2. 对图书的数据进行处理
//        // 3. 返回数据
//
//        List<BookInfo> bookInfos = bookService.getBookList();
//        return bookInfos;
//    }

    // 返回页面条数
    @RequestMapping("/getBookListByPage")
    //public PageResult<BookInfo> getBookListByPage(PageRequest pageRequest){
    public Result getBookListByPage(PageRequest pageRequest, HttpSession session){ //*
        // 传入 当前页的内容
        // 传入的参数最好定义为对象的形式, 为了之后方便扩展

        log.info("查询翻页信息,pageRequest:{}",pageRequest);

        // 用户登录校验 //*
        //UserInfo userInfo = (UserInfo) session.getAttribute("session_user_key"); // 获取session
//        UserInfo userInfo = (UserInfo) session.getAttribute(Constant.SESSION_USER_KEY); // 获取session
//        if(userInfo == null || userInfo.getId()<=0||"".equals(userInfo.getUserName())){
//            // 用户未登录
////            Result result = new Result(); //*
////            result.setCode(ResultCode.UNLOGIN); //*
////            result.setErrMsg("未登录"); //*
////            result.setData(null); //*
////              return result; //*
//
//            // 继续升级
//            return Result.unlogin();
//
//        }

        // 有了拦截器之后 上面的代码就可以不需要了, 直接在拦截器里面实现了

        // 校验成功接下来开始请求
        if(pageRequest.getPageSize()<0 || pageRequest.getCurrentPage()<1){
           // return null;
            return Result.fail("参数校验失败"); //*
        }
        PageResult<BookInfo> bookInfoPageResult = null;
        try {
           bookInfoPageResult =  bookService.selectBookInfoByPage(pageRequest);
//            Result result = new Result(); //*
//            result.setCode(ResultCode.SUCCESS); //*
//            result.setErrMsg("");//*
//            result.setData(bookInfoPageResult); //*
//            return result; //*

            // 继续升级
            return Result.success(bookInfoPageResult);

        }catch (Exception e){
            log.error("查询翻页信息错误, e:{}",e);
//            Result result = new Result(); //*
//            result.setCode(ResultCode.FAIL); //*
//            result.setErrMsg(e.getMessage());//*
//            result.setData(bookInfoPageResult); //*
//            return result; //*

            // 继续升级
            return Result.fail(e.getMessage());
        }
    }

    @RequestMapping(value = "/addBook",produces = "application/json")
    // 如果后端返回的结果是 String 类型时
    // 当我们使用统一结果返回时, 返回的是 JSON 字符串
    // 这时候 content-Type 是 text/html
    // 我们需要把他转换为 JSON
    // 有两种转换方式: 后端转换, 通过注解 的 produces 属性来设置后端返回类型
    // 第二种方式: 前端把字符串转换为 对象: JSON.parse(result) 这个函数来转换

    public String addBook(BookInfo bookInfo){
        log.info("接收到添加图书请求, bookInfo:{}",bookInfo);
        // 参数校验
        if(!StringUtils.hasLength(bookInfo.getBookName())
                || !StringUtils.hasLength(bookInfo.getAuthor())
                || bookInfo.getCount() < 0
                || bookInfo.getPrice() == null
                || !StringUtils.hasLength(bookInfo.getPublish())){
            return "参数校验失败, 请检查入参";
        }
        Integer result =  bookService.addBook(bookInfo);
        if(result <= 0){
            log.error("添加失败, bookInfo:{}",bookInfo);
            return "添加图书出错, 请联系管理员";
        }
        return "";
    }


    // 修改图书
    // 先查询接口
    @RequestMapping("/queryBookInfoById")
    public BookInfo queryBookInfoById(Integer bookId){
        log.info("根据Id查询图书, bookId:{}"+bookId);

        try {
         BookInfo  bookInfo  = bookService.queryBookInfoById(bookId);
         return bookInfo;
        }catch (Exception e){
            log.error("查询图书信息失败, e:{}",e);
        }
        return null;
    }

    @RequestMapping(value = "/updateBook",produces = "application/json")
    public String updateBook(BookInfo bookInfo){
        log.info("接收到更新图书的请求, bookInfo:{}",bookInfo);
        Integer result = bookService.updateBook(bookInfo);
        if(result==0){
            log.error("更新图书失败, 请联系管理员");
            return "更新图书失败, 请联系管理员";
        }
        return "";
    }

    @RequestMapping(value = "/batchDelete",produces = "application/json")
    public String batchDelete(@RequestParam  List<Integer> ids){
        log.info("接收请求,批量删除图书 ids:{}",ids);
        Integer result =  bookService.batchDelete(ids);
        if(result <= 0){
            log.error("批量删除失败,请联系管理员, ids:{}",ids);
            return "批量删除失败,请联系管理员";
        }
        return "";
    }

}
